package cn.bearspark.common.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 数据对象的工具类
 *
 * @author f
 */
public class DataUtil {

    /**
     * 将获取到的数据，根据 key 分组，转换成 映射嵌套集合 的形式
     *
     * @param <S>       原始对象的类型
     * @param <T>       目标对象的类型
     * @param mapSize   映射的大小
     * @param tarClazz  目标对象的 Class 对象
     * @param supplier  原始对象的提供者
     * @param keyGetter 原始对象中 key 的获取器，key 必须是 long/Long 类型的
     * @return 根据 key 分组后的 映射嵌套集合 的形式
     */
    public static <S, T> Map<Long, List<T>> group(int mapSize, Class<T> tarClazz,
                                                  Supplier<List<S>> supplier, Function<S, Long> keyGetter) {
        List<S> srcList = supplier.get();
        Map<Long, List<T>> map = new HashMap<>(mapSize);
        int size = srcList.size();
        int i = 0;
        while (i < size) {
            long moduleDataId = keyGetter.apply(srcList.get(i));
            int j = i + 1;
            while (j < size && keyGetter.apply(srcList.get(j)) == moduleDataId) {
                j++;
            }
            map.put(moduleDataId, ConvertBeanUtil.convertList(srcList.subList(i, j), tarClazz));
            i = j;
        }
        return map;
    }
}
